home *** CD-ROM | disk | FTP | other *** search
- TITLE CA_Del
- page ,132
-
- _TEXT SEGMENT BYTE PUBLIC 'CODE'
- ASSUME cs: _TEXT
-
- ORG 100H
-
- public CA_Del, Vector, Catch, Install
- public TempA, TempD
-
- CA_Del PROC FAR
- jmp Install
-
- Catch: mov WORD PTR cs:[TempA], ax
- mov ax, ds
- mov WORD PTR cs:[TempD], ax
-
- sub ax,ax ; Check out keyboard flags
- mov ds,ax
- mov al, BYTE PTR ds:[417h]
-
- ; WARNING: trapdoor to unlink CADEL. Press and release (in this order):
- ; Insert, Caps Lock, Num Lock, Scroll Lock
- ; Press and hold:
- ; Left Shift, Right Shift, CTRL, and ALT
- ; (You can let go now)
-
- cmp al, 0FFh ; All stati set?
- jnz Check_CA
-
- mov ax, WORD PTR cs:[Vector] ; Yes, deinstall our vector
- mov WORD PTR ds:[9*4], ax
- mov ax, WORD PTR cs:[Vector + 2]
- mov WORD PTR ds:[9*4 + 2], ax
- sub ax, ax
-
- Check_CA:
- and al, 0Ch
- cmp al, 0Ch ; Control and alt?
- jz CheckDel
-
- cmp al, 04h ; Control only?
- jnz GoVect ; If not, forget it
-
- in al, 60h ; Look for control C
- and al, 7Fh ; Up or down
- cmp al, 2Eh
- jz Eat_It ; If so, make it vanish
-
- cmp al, 46h ; Look for control break
- jz Eat_It
-
- jnz GoVect ; Otherwise let it pass
-
- CheckDel:
- in al,60h ; read the key
- and al,7Fh
- cmp al,53h ; DEL?
- jnz GoVect ; if not, forget it
-
- Eat_It: in al,61H ; Get value of keyboard control lines
- mov ah,al ; Save it
- or al,80h ; Set the "enable kbd" bit
- out 61H,al ; and write it out the control port
- xchg ah,al ; Fetch original control port value
- out 61H,al ; and write it back
- mov al,20H ; Send End-Of-Interrupt signal
- out 20H,al ; to the 8259 Interrupt Controller
-
- mov ax, WORD PTR cs:[TempD]
- mov ds,ax
- mov ax, WORD PTR cs:[TempA]
- iret
-
- GoVect: mov ax, WORD PTR cs:[Vector+2]
- push ax
- mov ax, WORD PTR cs:[Vector]
- push ax
- mov ax, WORD PTR cs:[TempD]
- mov ds,ax
- mov ax, WORD PTR cs:[TempA]
- ret ; (Far return to original vector)
-
- TempA: dw 0
- TempD: dw 0
- Vector: dd 0
-
- Install:
- push cs ; Establish segment registers
- pop es
- sub ax, ax
- mov ds, ax
- mov di, OFFSET Vector
- mov si, 9*4
- movsw ; Copy the current vector
- movsw
-
- mov ax,cs ; Install my cs
- mov ds:[9*4+2],ax
- mov ax, OFFSET Catch ; and IP
- mov ds:[9*4], ax
-
- push cs
- pop ds
-
- mov dx, OFFSET CADisabled ; Tell them what we've done
- mov ah,9
- int 21h
-
- mov ax, WORD PTR cs:[2Eh] ; Free up environment
- mov es, ax
- mov ax, 4900H
- int 21h
-
- mov dx, OFFSET Install ; Calculate # of paragraphs
- add dx, 15 ; Minus PSP, round up
- rcr dx, 1
- sar dx, 1
- sar dx, 1
- sar dx, 1
-
- mov ax,3100h
- int 21h ; Terminate and stay resident
- int 20h ; Just in case
-
- CADisabled:
- db "Control-Alt Del is disabled"
- db 13,10,"$"
-
- My_DS: dw 0
-
- CA_Del ENDP
-
- _TEXT ENDS
- END CA_Del